# -*- coding: utf-8 -*-

DEBUG = True

CIELO_TESTES_SERVER = 'https://qasecommerce.cielo.com.br/servicos/ecommwsec.do'
CIELO_PROD_SERVER = 'https://ecommerce.cbmp.com.br/servicos/ecommwsec.do'

#url utilizada para a primeira troca de mensagens com a cielo
URL_TRANSACAO = CIELO_TESTES_SERVER

#url em sua loja para a qual o cliente sera redirecionado ao finalizar a transacao
URL_RETORNO = 'http://testes.dev.doois.com.br/recebe'

from datetime import datetime
import httplib
import urllib
import re
from xml.dom.minidom import parse, parseString


DADOS_LOJA = {}
#numero de afiliacao da loja com a Cielo (max_length=20)
DADOS_LOJA['numero'] = '1006993069'
#chave de acesso da loja atribuida pela Cielo (max_length=100)
DADOS_LOJA['chave'] = '25fbb99741c739dd84d7b06ec78c9bac718838630f30b112d033ce2e621b34f3'
DADOS_LOJA['nome'] = 'Loja Teste'
DADOS_LOJA['codigo-pais'] = '097'


class Mensagem():

    def __init__(self):
        self.valores = {}
        self.xml = ''
        self.dados_portador = {}
        self.forma_pagamento = {}
        self.dados_pedido = {}
        self.dados_ec = DADOS_LOJA
        self.dom = None
        self.url_comunicacao = URL_TRANSACAO

        #numero do cartao (length=16)
        self.dados_portador['numero'] = '4551870000000183'
        #validade do cartao (length=6)
        self.dados_portador['validade'] = '201512' #Dez 2015
        #Indicador do codigo de seguranca: 0 (nao informado), 1 (informado), 2 (ilegivel), 9 (inexistente).
        self.dados_portador['indicador'] = '9'
        #Obrigatorio se indicador = 1. Para Amex, e obrigatorio e sempre possui 4 posicoes. (length=3|4)
        self.dados_portador['codigo-seguranca'] = '945'
        #opcional. Nome impresso no cartao. (max_length=50)
        self.dados_portador['nome-portador'] = 'Jorginho'
        #Bandeira: visa, mastercard, amex, diners, discover ou elo (em minusculo)
        self.forma_pagamento['bandeira'] = 'visa'
        #codigo do produto: 1 (Credito a Vista), 2 (Parcelado loja), 3 (Parcelado administradora), A (Debito)
        self.forma_pagamento['produto'] = '1'
        #numero de parcelas. Para credito a vista ou debito, utilizar 1. (max_length=3)
        self.forma_pagamento['parcelas'] = '1'
        #id do pedido na loja (max_length=20)
        self.dados_pedido['numero'] = '12345678901234567890'
        #valor do pedido (max_length=12)
        self.dados_pedido['valor'] = '1100'
        #codigo numerico da moeda na ISO 4217. Para o Real, o codigo e 986.
        self.dados_pedido['moeda'] = '986'
        #data e hora de envio do pedido (length=19) Exemplo: 2010-07-14T13:56:12
        self.dados_pedido['data-hora'] = datetime.strftime( datetime.now(), "%Y-%m-%dT%H:%M:%S" )
        #descricao do pedido. (Opcional. max_length=1024)
        self.dados_pedido['descricao'] = 'Uma descricao so para nao deixar em branco.'
        #Idioma do pedido: PT (portugues), EN (ingles) ou ES (espanhol).
        #Com base nessa informacao e definida a lingua a ser utilizada nas
        #telas da Cielo. Caso nao preenchido, assume-se PT.
        self.dados_pedido['idioma'] = 'PT'
        ############# DADOS "EXTRAS" ####################
        #URL da pagina de retorno. E para essa tela que o fluxo sera
        #retornado ao fim da autenticacao e/ou autorizacao. (length: 1 - 1024)
        self.valores['url-retorno'] = URL_RETORNO
        #Indicador de autorizacao automatica:
        #0 (nao autorizar)
        #1 (autorizar somente se autenticada)
        #2 (autorizar autenticada e nao-autenticada)
        #3 (autorizar sem passar por autenticacao e valido somente para credito)
        #Para Amex, Diners, Discover e Elo, o valor sera sempre 3.
        self.valores['autorizar'] = '2'
        #Define se a transacao sera automaticamente capturada caso seja autorizada.
        #'true ou 'false'
        self.valores['capturar'] = 'true'
        #campo livre. (0 - 128)
        self.valores['campo-livre'] = ''
        #Seis primeiros numeros do cartao. (length=6)
        self.valores['bin'] = self.dados_portador['numero'][:6]

    '''
    envia o xml para comunicacao com a cielo e retorna a resposta da cielo
    ja convertida para DOM
    '''
    def enviaXml(self):
        if DEBUG:
            print self.xml
        query = urllib.urlencode({'mensagem':self.xml})
        f = urllib.urlopen(self.url_comunicacao, query)
        contents = f.read()
        if DEBUG:
            print '\n\n\n'+contents
        #transforma a resposta (pagina XML) em DOM
        self.dom = parseString( contents )
        f.close()


    def recValores(self, cursor, taglist):
        aux = {}
        for p in taglist:
            try:
                aux[p] = cursor.getElementsByTagName(p)[0].childNodes[0].nodeValue
            except:
                aux[p] = None
        return aux

    def recValor(self, cursor, tag):
        try:
            return cursor.getElementsByTagName(tag)[0].childNodes[0].nodeValue
        except:
            return None


    def executa(self):
        self.geraXml()
        #xml = xml.encode('ISO-8859-1')
        #envia a requisicao xml e recebe a resposta convertida para DOM
        self.enviaXml()

        #verifica se nao houve erro
        ok = self.verificaResposta()
        if ok:
            #se nao houve erro: recupera os dados da transacao
            saida = self.recDados()
        else:
            #se houve erro: recupera a mensagem de erro
            saida = self.recErro()
        return saida


    def recErro(self):
        cursor = self.dom.getElementsByTagName('erro')[0]
        saida = self.recValores( cursor, ['codigo', 'mensagem'] )
        if DEBUG:
            print '\n\nErro: \n'+str(saida)
        return saida


    def verificaResposta(self):
        try:
            cursor = self.dom.getElementsByTagName('transacao')[0]
            return True
        except:
            cursor = self.dom.getElementsByTagName('erro')[0]
            return False

    '''
    Gera a requisicao XML com os dados armazenados no dicionario "valores".
    '''
    def geraXml(self):
        pass

    def recDados(self):
        pass






'''
Inicia a transacao com a Cielo.
'''
class Transacao(Mensagem):
    '''Regras
    O envio ou nao-envio dos dados do cartao deve ser condizente com o
    cadastro da loja junto a Cielo.
    A forma de pagamento (modalidade e número de parcelas) deve tambem
    ser condizente com o cadastro.'''

    def __init__(self):
        Mensagem.__init__(self)

    '''
    Gera a requisicao XML com os dados armazenados no dicionario "valores".
    '''
    def geraXml(self):
        xml = '<?xml version="1.0" encoding="ISO-8859-1"?>\n'
        xml += '<requisicao-transacao id="1" versao="1.1.1">\n\n'
        xml += '<dados-ec>\n'
        xml += '\t<numero>'+self.dados_ec['numero']+'</numero>\n'
        xml += '\t<chave>'+self.dados_ec['chave']+'</chave>\n'
        xml += '</dados-ec>\n'
        xml += '<dados-portador>\n'
        xml += '\t<numero>' + self.dados_portador['numero'] + '</numero>\n'
        xml += '\t<validade>' + self.dados_portador['validade'] + '</validade>\n'
        xml += '\t<indicador>' + self.dados_portador['indicador'] + '</indicador>\n'
        xml += '\t<codigo-seguranca>' + self.dados_portador['codigo-seguranca'] + '</codigo-seguranca>\n'
        xml += '\t<nome-portador>' + self.dados_portador['nome-portador'] + '</nome-portador>\n'
        xml += '</dados-portador>\n'
        xml += '<dados-pedido>\n'
        xml += '\t<numero>' + self.dados_pedido['numero'] + '</numero>\n'
        xml += '\t<valor>' + self.dados_pedido['valor'] + '</valor>\n'
        xml += '\t<moeda>' + self.dados_pedido['moeda'] + '</moeda>\n'
        xml += '\t<data-hora>' + self.dados_pedido['data-hora'] + '</data-hora>\n'
        xml += '\t<descricao>' + self.dados_pedido['descricao'] + '</descricao>\n'
        xml += '\t<idioma>' + self.dados_pedido['idioma'] + '</idioma>\n'
        xml += '</dados-pedido>\n'
        xml += '<forma-pagamento>\n'
        xml += '\t<bandeira>' + self.forma_pagamento['bandeira'] + '</bandeira>\n'
        xml += '\t<produto>' + self.forma_pagamento['produto'] + '</produto>\n'
        xml += '\t<parcelas>' + self.forma_pagamento['parcelas'] + '</parcelas>\n'
        xml += '</forma-pagamento>\n\n'
        xml += '<url-retorno>' + self.valores['url-retorno'] + '</url-retorno>\n'
        xml += '<autorizar>' + self.valores['autorizar'] + '</autorizar>\n'
        xml += '<capturar>' + self.valores['capturar'] + '</capturar>\n'
        xml += '<campo-livre>' + self.valores['campo-livre'] + '</campo-livre>\n'
        xml += '<bin>' + self.valores['bin'] + '</bin>\n'
        xml += '</requisicao-transacao>'
        self.xml = xml


    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        saida['tid'] = self.recValor( cursor, 'tid' )
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor( cursor, 'status' )
        saida['url-autenticacao'] = self.recValor( cursor, 'url-autenticacao')
        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida



class Autenticacao(Mensagem):
    '''Notas
    1. Somente o primeiro redirecionamento e de responsabilidade da loja virtual.
    2. O comprador e redirecionado ao site do Banco Emissor somente se a autenticacao estiver
    disponivel. Caso contrario a transacao prossegue a autorizacao (exceto se foi apenas
    solicitada autenticacao)
    3. Ate o momento (julho de 2011), nao ha mecanismos de autenticacao para a bandeira Elo,
    Diners, Discover e Amex.'''

    def __init__(self, url, tid):
        Mensagem.__init__(self)
        self.url_autenticacao = str(url)
        self.tid = str(tid)

    '''
    Gera a requisicao XML com os dados armazenados no dicionario "valores".
    '''
    def geraXml(self):
        xml =  '<requisicao-autenticacao id="'+self.tid+'" versao="1.1.1">'
        xml +=    '<dados-ec>'
        xml +=        '<numero>'+self.dados_ec['numero']+'</numero>'
        xml +=        '<chave>'+self.dados_ec['chave']+'</chave>'
        xml +=        '<nome>'+self.dados_ec['nome']+'</nome>'
        xml +=        '<codigo-pais>'+self.dados_ec['codigo-pais']+'</codigo-pais>'
        xml +=    '</dados-ec>'

        xml +=    '<dados-portador>'
        xml +=        '<numero>'+self.dados_portador['numero']+'</numero>'
        xml +=        '<validade>'+self.dados_portador['validade']+'</validade>'
        xml +=        '<indicador>'+self.dados_portador['indicador']+'</indicador>'
        xml +=        '<codigo-seguranca>'+self.dados_portador['codigo-seguranca']+'</codigo-seguranca>'
        xml +=    '</dados-portador>'

        xml +=    '<dados-pedido>\n'
        xml +=        '\t<numero>' + self.dados_pedido['numero'] + '</numero>\n'
        xml +=        '\t<valor>' + self.dados_pedido['valor'] + '</valor>\n'
        xml +=        '\t<moeda>' + self.dados_pedido['moeda'] + '</moeda>\n'
        xml +=        '\t<data-hora>' + self.dados_pedido['data-hora'] + '</data-hora>\n'
        xml +=        '\t<descricao>' + self.dados_pedido['descricao'] + '</descricao>\n'
        xml +=        '\t<idioma>' + self.dados_pedido['idioma'] + '</idioma>\n'
        xml +=    '</dados-pedido>\n'

        xml +=    '<forma-pagamento>\n'
        xml +=        '\t<bandeira>' + self.forma_pagamento['bandeira'] + '</bandeira>\n'
        xml +=        '\t<produto>' + self.forma_pagamento['produto'] + '</produto>\n'
        xml +=        '\t<parcelas>' + self.forma_pagamento['parcelas'] + '</parcelas>\n'
        xml +=    '</forma-pagamento>\n\n'

        xml +=    '<url-retorno>'+self.valores['url-retorno']+'</url-retorno>'
        xml +=    '<autorizar>'+self.valores['autorizar']+'</autorizar>'
        xml +=    '<capturar>'+self.valores['capturar']+'</capturar>'
        xml += '</requisicao-autenticacao>'
        self.xml = xml




    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor( cursor, 'status' )
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('autenticacao')[0]
        saida['autenticacao'] = self.recValores( cursor2, ['codigo', 'mensagem', 'data-hora', 'valor', 'eci'])
        #1..2   Codigo do processamento.
        #1..100 Detalhe do processamento.
        #19     Data hora do processamento.
        #1..12  Valor do processamento sem pontuacao. Os dois ultimos digitos sao os centavos.
        #2      Nivel de seguranca.
        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida


class Autorizacao(Mensagem):
    '''Regras
    Nao e aceito pedido de autorização caso a autenticacao tenha sido negada. No
    caso de falha, a solicitacao de autorizacao e recusada (somente para a Visa).
    A solicitacao de autorizacao posterior pode ser efetuada em ate 90 dias
    contados a partir da data da transacao.'''

    def __init__(self, tid):
        Mensagem.__init__(self)
        self.tid = str(tid)

    '''
    Gera a requisicao XML com os dados armazenados no dicionario "valores".
    '''
    def geraXml(self):
        xml =   '<?xml version="1.0" encoding="ISO-8859-1"?>'
        xml +=  '<requisicao-autorizacao-tid id="2" versao="1.1.1">'
        xml +=  '<tid>'+self.tid+'</tid>'
        xml +=  '<dados-ec>'
        xml +=       '<numero>'+self.dados_ec['numero']+'</numero>'
        xml +=       '<chave>'+self.dados_ec['chave']+'</chave>'
        xml +=  '</dados-ec>'
        xml +=  '</requisicao-autorizacao-tid>'
        self.xml = xml

    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor(cursor, 'status')
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('autorizacao')[0]
        saida['autorizacao'] = self.recValores( cursor2, ['codigo', 'mensagem', 'data-hora', 'valor', 'lr', 'arp', 'nsu'] )
        #1..2   Codigo do processamento.
        #1..100 Detalhe do processamento.
        #19     Data hora do processamento
        #1..12  Valor do processamento sem pontuacao. Os dois ultimos digitos sao os centavos.
        #2      Retorno da autorizacao. Quando negada, e o motivo da negacao.
        #6      Codigo da autorizacao caso a transacao tenha sido autorizada com sucesso.
        #6      Numero de sequencia da autorizacao.
        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida


class Consulta(Mensagem):
    '''Regras
    Somente transacoes dos ultimos 180 dias estao disponiveis para consulta'''

    def __init__(self, tid):
        Mensagem.__init__(self)
        self.tid = str(tid)

    def geraXml(self):
        xml =  '<?xml version="1.0" encoding="ISO-8859-1"?>\n'
        xml += '<requisicao-consulta id="5" versao="1.1.1">\n'
        xml +=    '\t<tid>'+self.tid+'</tid>\n'
        xml +=    '\t<dados-ec>\n'
        xml +=       '\t\t<numero>'+self.dados_ec['numero']+'</numero>\n'
        xml +=       '\t\t<chave>'+self.dados_ec['chave']+'</chave>\n'
        xml +=    '\t</dados-ec>\n'
        xml += '</requisicao-consulta>\n'
        self.xml = xml

    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        saida['tid'] = self.recValor( cursor, 'tid' )
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor( cursor, 'status' )
        saida['url-autenticacao'] = self.recValor( cursor, 'url-autenticacao')
        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida


#ainda nao implementado
class Captura(Mensagem):
    '''Regras:
    Por padrao, o prazo maximo para captura e de 5 dias apos a data de autorizacao.
    Exemplo: se a data de autorizacao e 21/09, o prazo maximo e as 0 h do dia 27/09.
    O valor da captura deve ser menor (captura parcial) ou igual (captura total) ao valor autorizado.
    Somente transacoes autorizadas podem ser capturadas.
    Em caso de falha na captura, outras tentativas poderao ser realizadas.'''

    def __init__(self, tid):
        Mensagem.__init__(self)
        self.tid = str(tid)

    def geraXml(self):
        xml =  '<?xml version="1.0" encoding="ISO-8859-1"?>\n'
        xml += '<requisicao-captura id="3" versao="1.1.1">\n'
        xml +=    '\t<tid>'+self.tid+'</tid>\n'
        xml +=    '\t<dados-ec>\n'
        xml +=       '\t\t<numero>'+self.dados_ec['numero']+'</numero>\n'
        xml +=       '\t\t<chave>'+self.dados_ec['chave']+'</chave>\n'
        xml +=    '\t</dados-ec>\n'
        xml +=    '\t<anexo>anexo 1-1024 Informacoes adicionais para detalhamento da captura.</anexo>\n'
        xml += '</requisicao-captura>\n'
        self.xml = xml

    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        saida['tid'] = self.recValor( cursor, 'tid' )
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor( cursor, 'status' )
        cursor2 = cursor.getElementsByTagName('captura')[0]
        saida['captura'] = self.recValores( cursor2, ['codigo', 'mensagem', 'data-hora', 'valor'] )
        #1..2    Codigo do processamento.
        #1..100  Detalhe do processamento. 
        #19      Data hora do processamento.
        #1..12   Valor do processamento sem pontuacao. Os dois ultimos digitos sao os centavos.
        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida

#ainda nao implementado
class Cancela(Mensagem):
    '''Regras
    Aplicavel somente para transacao autorizada ou capturada.
    Deve ser solicitado no mesmo dia da autorizacao.'''

    def __init__(self, tid):
        Mensagem.__init__(self)
        self.tid = str(tid)

    def geraXml(self):
        xml =  '<?xml version="1.0" encoding="ISO-8859-1"?>\n'
        xml += '<requisicao-cancelamento id="4" versao="1.1.1">\n'
        xml +=    '\t<tid>'+self.tid+'</tid>\n'
        xml +=    '\t<dados-ec>\n'
        xml +=       '\t\t<numero>'+self.dados_ec['numero']+'</numero>\n'
        xml +=       '\t\t<chave>'+self.dados_ec['chave']+'</chave>\n'
        xml +=    '\t</dados-ec>\n'
        xml += '</requisicao-cancelamento>\n'
        self.xml = xml

    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        saida['tid'] = self.recValor( cursor, 'tid' )
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor( cursor, 'status' )
        cursor2 = cursor.getElementsByTagName('cancelamento')[0]
        saida['cancelamento'] = self.recValores( cursor2, ['codigo', 'mensagem', 'data-hora', 'valor'] )
        #1..2    Codigo do processamento.
        #1..100  Detalhe do processamento.
        #19      Data hora do processamento.
        #1..12   Valor do processamento sem pontuacao. Os dois ultimos digitos sao os centavos.
        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida

#ainda nao implementado
class AutorizacaoDireta(Mensagem):
    '''Regras
    A loja virtual deve estar habilitada a enviar os dados do cartao
    A forma de pagamento (modalidade e numero de parcelas) deve ser condizente com o
    cadastro da loja
    A autorizacao direta não se aplica as transacoes de Debito pois esse tipo requer
    autenticacao
    O nivel de seguranca da transacao (ECI) e definido como 7 (se Visa, Amex, Diners,
    Discover ou Elo) e 0 (se Mastercard)'''

    def __init__(self):
        Mensagem.__init__(self)

    '''
    Gera a requisicao XML com os dados armazenados no dicionario "valores".
    '''
    def geraXml(self):
        xml = '<?xml version="1.0" encoding="ISO-8859-1"?>\n'
        xml += '<requisicao-transacao id="7" versao="1.1.1">\n\n'
        xml += '<dados-ec>\n'
        xml += '\t<numero>'+self.dados_ec['numero']+'</numero>\n'
        xml += '\t<chave>'+self.dados_ec['chave']+'</chave>\n'
        xml += '</dados-ec>\n'
        xml += '<dados-portador>\n'
        xml += '\t<numero>' + self.dados_portador['numero'] + '</numero>\n'
        xml += '\t<validade>' + self.dados_portador['validade'] + '</validade>\n'
        xml += '\t<indicador>' + self.dados_portador['indicador'] + '</indicador>\n'
        xml += '\t<codigo-seguranca>' + self.dados_portador['codigo-seguranca'] + '</codigo-seguranca>\n'
        xml += '\t<nome-portador>' + self.dados_portador['nome-portador'] + '</nome-portador>\n'
        xml += '</dados-portador>\n'
        xml += '<dados-pedido>\n'
        xml += '\t<numero>' + self.dados_pedido['numero'] + '</numero>\n'
        xml += '\t<valor>' + self.dados_pedido['valor'] + '</valor>\n'
        xml += '\t<moeda>' + self.dados_pedido['moeda'] + '</moeda>\n'
        xml += '\t<data-hora>' + self.dados_pedido['data-hora'] + '</data-hora>\n'
        xml += '\t<descricao>' + self.dados_pedido['descricao'] + '</descricao>\n'
        xml += '\t<idioma>' + self.dados_pedido['idioma'] + '</idioma>\n'
        xml += '</dados-pedido>\n'
        xml += '<forma-pagamento>\n'
        xml += '\t<bandeira>' + self.forma_pagamento['bandeira'] + '</bandeira>\n'
        xml += '\t<produto>' + self.forma_pagamento['produto'] + '</produto>\n'
        xml += '\t<parcelas>' + self.forma_pagamento['parcelas'] + '</parcelas>\n'
        xml += '</forma-pagamento>\n\n'
        xml += '<autorizar>3</autorizar>\n' #autorizar direto
        xml += '<capturar>' + self.valores['capturar'] + '</capturar>\n'
        xml += '<campo-livre>' + self.valores['campo-livre'] + '</campo-livre>\n'
        xml += '</requisicao-transacao>'
        self.xml = xml

    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        saida['tid'] = self.recValor( cursor, 'tid' )
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor( cursor, 'status' )
        cursor2 = cursor.getElementsByTagName('autenticacao')[0]
        saida['autenticacao'] = self.recValores( cursor2, ['codigo', 'mensagem', 'data-hora', 'valor', 'eci'] )
        cursor2 = cursor.getElementsByTagName('autorizacao')[0]
        saida['autorizacao'] = self.recValores( cursor2, ['codigo', 'mensagem', 'data-hora', 'valor', 'lr', 'nsu'] )

        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida



#ainda nao implementado
class ConsultaNumeroPedido(Mensagem):
    '''Regras
    Somente transacoes dos ultimos 180 dias estao disponiveis para consulta
    Caso a loja virtual possua mais de uma transacao para um mesmo numero do pedido,
    retorna-se a transacao mais recente apenas.'''
    def __init__(self, tid):
        Mensagem.__init__(self)
        self.tid = str(tid)

    def geraXml(self):
        xml =  '<?xml version="1.0" encoding="ISO-8859-1"?>'
        xml += '<requisicao-consulta-chsec id="0da7e65c-afae-4db2-a605-a5d0db42ce83" versao="1.1.1">'
        xml +=    '\t<numero-pedido>'+ self.valores['dados-pedido']['numero'] +'</numero-pedido>'
        xml +=    '\t<dados-ec>\n'
        xml +=       '\t\t<numero>' + self.dados_ec['numero'] + '</numero>\n'
        xml +=       '\t\t<chave>' + self.dados_ec['chave'] + '</chave>\n'
        xml +=    '\t</dados-ec>\n'
        xml += '</requisicao-consulta-chsec>'
        self.xml = xml

    def recDados(self):
        saida = {}
        cursor = self.dom.getElementsByTagName('transacao')[0]
        saida['tid'] = self.recValor( cursor, 'tid' )
        saida['pan'] = self.recValor( cursor, 'pan' )
        cursor2 = cursor.getElementsByTagName('dados-pedido')[0]
        saida['dados-pedido'] = self.recValores( cursor2, ['numero', 'valor', 'moeda', 'data-hora', 'descricao', 'idioma'] )
        cursor2 = cursor.getElementsByTagName('forma-pagamento')[0]
        saida['forma-pagamento'] = self.recValores( cursor2, ['bandeira', 'produto', 'parcelas'] )
        saida['status'] = self.recValor( cursor, 'status' )
        saida['url-autenticacao'] = self.recValor( cursor, 'url-autenticacao')
        if DEBUG:
            print '\n\n\n\n'+ str(saida)
        return saida



def main():
    #valores possiveis de status:
    '''
    0    -   Criada
    1    -   Em andamento
    2    -   Autenticada
    3    -   Nao autenticada
    4    -   Autorizada ou pendente de captura
    5    -   Nao autorizada
    6    -   Capturada
    8    -   Nao capturada
    9    -   Cancelada
    10   -   Em Autenticacao'''

    '''Com a execucao do objeto Transacao, uma transacao com a Cielo deve ser
    criada, ou seja, devemos ter status == 0.'''
    t = Transacao()
    saida = t.executa()
    tid = saida['tid']
    url = saida['url-autenticacao']
    status = saida['status']

    '''Agora a loja deve encaminhar o cliente para a url-autenticacao gerada pela 
    Cielo. É onde o cliente vai inserir seus dados no sistema da Cielo/banco
    para autenticar a transacao.'''
    #t = Autenticacao(url, tid)
    #saida = t.executa()
    #status = saida['status']
    print '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'
    print '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'
    t = Consulta(tid)
    saida = t.executa()

    '''Neste ponto a loja devera aguardar o redirecionamento da Cielo.
    Ao recebe-lo, devera verificar a situacao atual da transacao (status) e, se
    se tratar de uma transacao autenticada'''
    #t = Autorizacao(tid)
    #saida = t.executa()
    

if __name__ == "__main__":
    main()
